package com.lym.order.feign;

import com.lym.order.feign.fallback.ProductFeignClientFallback;
import com.lym.product.bean.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 商品Feign客户端
 *
 * 注意说明: @FeignClient(name = "service-product", contextId = "productFeignClient")
 * contextId: 用于区分FeignClient实例,如果contextId相同,则只会创建一个FeignClient实例. 这里的contextId为可以在 application-feign.yml中使用
 * 如果不配置contextId,则默认为FeignClient名称,在这里就是 service-product
 */
@FeignClient(name = "service-product", fallback = ProductFeignClientFallback.class) // 引入Feign客户端
public interface ProductFeignClient {

    /**
     * 根据商品ID查询商品
     *
     * 注意:
     * - FeignClient接口方法名必须与FeignClient服务端接口方法名一致
     * - FeignClient接口方法参数必须与FeignClient服务端接口方法参数一致
     * - FeignClient接口方法返回值必须与FeignClient服务端接口方法返回值一致
     * - FeignClient接口方法参数注解必须与FeignClient服务端接口方法参数注解一致
     * - FeignClient接口方法参数注解@PathVariable("id")必须与FeignClient服务端接口方法参数注解@PathVariable("id")一致
     * - FeignClient接口方法参数注解@PathVariable("id")值必须与FeignClient服务端接口方法参数注解@PathVariable("id")值一致
     *
     * 注意: @GetMapping此类注解是MVC中的注解,目前MVC注解有了两套使用逻辑
     *      1、标注在Controller类中的方法上,表示接受这样的请求
     *      2、标注在FeignClient类中的方法上,表示发送这样的请求
     *
     * @param id
     */
    @GetMapping("/product/{id}")
    Product getProductById(@PathVariable("id") Long id);

}
